package com.platform.framework.util.pub;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 微信支付专用XML工具类
 * @author ly-liugaoyang
 * 
 */
@SuppressWarnings({"rawtypes","unchecked"})
public class XmlUtil {

	public static String getParam(String xml, String key) {
		if( xml == null || key == null )
			return null;
		if( xml.contains("<"+key+">") ) {
           	return xml.substring(xml.indexOf("<"+key+">"), xml.indexOf("</"+key+">"))
				    .replaceAll("<!\\[CDATA\\[", "").replaceAll("]]>", "").replaceAll("<"+key+">", "");
		}
		return null;
	}
	
	
	/**
	 * 把XML转为实体类，将xml字段跟实体字段作对比，如果匹配则把XML值赋给实体对应字段。
	 * @param xml
	 * @param object
	 * @return
	 */
	public static void xml2Entity (String xml,Object object) {
		Field[] fields = object.getClass().getDeclaredFields();  // 得到obj所有字段，并遍历obj所有字段。
		for(int i=0;i<fields.length;i++) {
			String fieldName = trans(fields[i].getName()); // 得到字段名
			String fieldValue = getParam(xml,fieldName); // 如果能根据字段名得到字段值，说明该字段可以被set入实体，如果该字段没有值，则continue。
			if (Validation.isEmpty(fieldValue)) {
				continue;
			}
			if (fields[i].getType().equals(String.class)) { // 得到字段类型
				ReflectUtil.setFieldValueByName(fields[i].getName(), object, fieldValue, String.class);
			} else if (fields[i].getType().equals(Date.class)) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");  // 此处为微信官方返回日期格式
    			@SuppressWarnings("unused")
				Date date = null;
    		    try {
					date = sdf.parse(fieldValue);
				} catch (ParseException e) {
					e.printStackTrace();
				}
    		    ReflectUtil.setFieldValueByName(fields[i].getName(), object, date, Date.class);
			} 
			
		}
		
	}
	
	/**
	 * 
	 * @param map
	 * @return
	 */
	public static String map2Xml (Map<String,Object> map) {
		
		return null;
	}
	
	
	/**
	 * 把驼峰式字段转化为下划线式字段。
	 * @param str
	 * @return
	 */
	public static String trans(String str){
        
		List record =new ArrayList();
        for(int i=0;i<str.length();i++)
        {
            char tmp =str.charAt(i);
             
            if((tmp<='Z')&&(tmp>='A'))
            {
                record.add(i);//记录每个大写字母的位置
            }
             
        }
        str= str.toLowerCase();
        char[] charofstr = str.toCharArray();
        String[] t =new String[record.size()];
        for(int i=0;i<record.size();i++)
        {
            t[i]="_"+charofstr[(int)record.get(i)];//加“_”
        }
        String result ="";
        int flag=0;
        for(int i=0;i<str.length();i++)
        {
            if((flag<record.size())&&(i==(int)record.get(flag))){
                result+=t[flag];
                flag++;
            }
            else
                result+=charofstr[i];
        }
         
        return result;
    }
	
	/**
	 * 测试
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Map<String,Object> map = new HashMap<String, Object>();
		map.put("sign", "DFSF13174813RAEDA");
		map.put("hello", "world");
		map.put("prepay_id", "123142asdasa");
		String xmlStr = mapToXml(map);
		System.out.println(xmlStr);
	}
	
	/**
	 * map转化为xml
	 * @param map
	 * @return
	 */
	public static String mapToXml (Map map) {
		
		StringBuffer xmlStr = new StringBuffer("<xml>");
		Iterator i= map.entrySet().iterator();
		while(i.hasNext()){
			Map.Entry e = (Map.Entry)i.next();
			System.out.println(e.getKey()+"="+e.getValue());
			if (!Validation.isEmpty(e.getKey()) && !Validation.isEmpty(e.getValue())) {
				xmlStr.append("<").append(e.getKey().toString()).append(">").append(e.getValue().toString()).append("</").append(e.getKey().toString()).append(">");
			}
		}
		xmlStr.append("</xml>");
		return xmlStr.toString();
	}
	
}
